//配置路由规则
import Vue from "vue";
import VueRouter from 'vue-router'

//使用插件
Vue.use(VueRouter)

import routes from './routes'
//引入store
import store from '@/store'

//先把VueRouter圆形对象的push，先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace

//重写push||replace
//第一个参数：告诉原来的push方法，你往哪里跳(传递那些参数)
//第二个参数：成功的回调
//第三个参数：失败的回调
//call||apply区别：
//相同点，都可以调用函数一次，都可以篡改函数的上下文一次
//不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}

//配置路由
let router = new VueRouter({
    routes,
    //跳转到新路由组件的滚动行为
    scrollBehavior(to, from, savedPosition) {
        //返回的这个y=0，代表的滚动条在最上方
        return { y: 0 }
    }

})

//全局守卫：前置守卫(在路由跳转之前进行判断)
router.beforeEach(async (to, from, next) => {
    //to:可以获取到你想要跳转到哪个路由的信息
    //from:可以获取到你从哪个路由而来的信息
    //next:放行函数
    //next();直接放行
    //next('/login');放行到指定路由
    //next(false);中断路由
    //用户登录了才会有token
    let token = store.state.user.token
    //用户的信息
    let name = store.state.user.userInfo.name
    if (token) {
        //用户已经登录了且还行去login[不能去了，就停留在首页]
        if (to.path == '/login') {
            next('/home')
        } else {
            //登录了但去的不是login【home|search|detail|shopcat】
            //如果用户名已有
            if (name) {
                next()
            } else {
                //如果没有用户名,派发action
                try {
                    //获取用户信息成功
                    await store.dispatch('getUserInfo')
                    //放行
                    next();
                } catch (error) {
                    //登录时间过长token失效了，用户信息无法再获取了，需要重新登录
                    //清除token
                    await store.dispatch('userLogOut')
                    //重新去登录
                    next('/login')
                }
            }
        }
    } else {
        //未登录不能去：交易相关、支付相关【pay、paysuccess】、个人中心【center】
        //未登录去上面的这些路由应该跳转至登录页面
        let toPath = to.path
        if (toPath.indexOf('trade') != -1 || toPath.indexOf('/pay') !== -1 || toPath.indexOf('/center') !== -1) {
            //把未登录的时候想去而没去成的信息，储存于地址中
            next('/login?redirect=' + toPath)
        } else {
            //去的不是上面的这些路由要直接放行
            next()
        }

    }
})

export default router;